#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <getopt.h>

#include "parseopt.h"

extern bool showflow;
extern bool showverb;
extern bool showcut;

static void show_help(char *filename);

void parse_opt(int argc, char **argv){
    /* Opciones cortas válidas */
    const char *op_cortas = "fvc";
    /* Arreglo que describe los valores largos correctos. */
    const struct option op_largas[] = {
        {"flujo", 0, NULL, 'f'},
        {"verbose", 0, NULL, 'v'},
        {"corte", 0, NULL, 'c'},
        {NULL, 0, NULL, 0}
    };
    int next_opt = 0;

    opterr = 0; /* Desactivo mensajes de error de 'getopt' */

    while(true){
        /* Obtengo la siguiente opción */
        next_opt = getopt_long(argc, argv, op_cortas, op_largas, NULL);

        if(next_opt == -1){ /* No se encontraron más opciones */
            break;
        }

        switch (next_opt) {
        case 'f':
            showflow = true;
            break;
        case 'v':
            showverb = true;
            break;
        case 'c':
            showcut = true;
            break;
        case '?':
            printf("getopt no reconoció la opción '%c'\n", optopt);
            show_help(argv[0]);
            exit(1);
        default : /* Algo no esperado. Abortamos */
            exit(1);
        }
    }
    return;
}

/* Muestra un mensaje de ayuda. */
static void show_help(char *filename){
    printf("Uso: %s [opciones]\n", filename);
    printf("\t-f  --flujo     Imprime una tabla con los valores del flujo\n"
           "\t-c  --corte     Imprime el corte minimal encontrado\n"
           "\t-v  --verbose   Imprime los caminos que se encuentran en los\n"
           "\t\t\tnetworks auxiliares y el flujo que transportan, más el\n"
           "\t\t\tincremento total del flujo en cada network auxiliar\n");
}

